package com.tedu.webmagic.weather;

import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Html;
import us.codecraft.webmagic.selector.Selectable;

import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 页面解析的  爬虫框架的组件
 */
public class PageProcessorImpl  implements PageProcessor {

    //爬虫的基本配置  site 类
    //设置重试次数；超时时间；请求间隔时间
    private Site site = Site.me().setRetryTimes(2).setTimeOut(5000).setSleepTime(1000);

    /**
     * 页面数据解析
     * 1. 有效数据----保存---page.PUTFILE  调用数据持久化  保存
     * 2. 有效url  添加爬虫队列，继续爬取；
     * @param page
     */
    public void process(Page page) {
        //获取html
        Html html = page.getHtml();
        //  匹配 “http://www.weather.com.cn/weather1d/[0-9]{9}.shtml”  继续获取天气数据
        Selectable regex = html.regex("http://www.weather.com.cn/weather1d/[0-9]{9}.shtml");
        // 把url添加到爬虫的队列
        page.addTargetRequests(regex.all());// 爬虫会自动爬取内容  程序一直运行
//        System.out.println(html);
        //解析出具体的数据  地址   湿度   温度  ；；；；

        //  通过  xpath   最简单
        // 通过  文档对象模型
        //  html----document对象
        Document document = html.getDocument();

        Element select = document.getElementById("today");
        // 解析  当前温度，湿度。。地址
        //在  p标签
        //tem
        Elements tem = select.getElementsByClass("tem").tagName("span");
        //获取最高温度和最低温度
        String text = tem.text();
        //使用正则表达式处理字符串
        String rge = "[0-9]+";
        //匹配
        Pattern compile = Pattern.compile(rge);
        Matcher matcher = compile.matcher(text);
        //  最高温度   最低温度
        matcher.find();
        String tem1 = matcher.group();
        matcher.find();
        String group = matcher.group();

//        System.out.println("最低温度："+tem1);
//        System.out.println("最高温度是："+group);
        //解析地址  从标题中解析
        //标题
        String title = document.getElementsByTag("title").text();
        //使用天气  截图
        int i = title.indexOf("天气");
        String address = title.substring(0,i);
//        System.out.println(address);

        //发送到PipelineImpl  类  保存数据库
        page.putField("tem1",tem1);//最低温度
        page.putField("group",group);//最高温度
        page.putField("address",address);//地址

    }

    /**
     * 返回爬虫 site对象  在爬取数据，会使用。
     * @return
     */
    public Site getSite() {
        return site;
    }
}
